package main

import "fmt"

// 1. 实现删除操作
func deleteElement(slice []int, index int) []int {
	//检查给定的 index 是否在有效范围内（即，index 应该在 0 和 len(slice)-1 之间）。如果 index 无效，直接返回原切片。
	//使用 append 函数将 index 位置的元素删除，并返回新的切片。
	if index < 0 || index >= len(slice) {
		return slice
	}
	return append(slice[:index], slice[index+1:]...)
}

// 2. 提高性能，避免内存拷贝，尝试直接移动元素
func deleteElementEfficient(slice []int, index int) []int {
	if index < 0 || index >= len(slice) {
		return slice
	}
	copy(slice[index:], slice[index+1:])
	//fmt.Println("Now Slice:", slice)
	return slice[:len(slice)-1]
}

/*type Number interface {
	~int | int64
}*/

// 3. 改造为泛型方法 ，用的是 1.21版本的go，按说可以使用泛型，但是会有报错，待验证解决
func deleteElementGeneric[T any](slice []T, index int) []T {
	if index < 0 || index >= len(slice) {
		return slice
	}
	copy(slice[index:], slice[index+1:])
	fmt.Println("Now Slice:", slice)
	return slice[:len(slice)-1]
}

// 4. 支持缩容机制
func deleteElementAndShrink[T any](slice []T, index int) []T {
	if index < 0 || index >= len(slice) {
		return slice
	}
	copy(slice[index:], slice[index+1:])
	slice = slice[:len(slice)-1]

	// 缩容机制,如果切片的长度小于容量的一半，并且长度与容量的比例小于设定的阈值 shrinkThreshold ，则将切片缩小为原来的 1/4。
	const shrinkThreshold = 0.25
	if len(slice) < cap(slice)/2 && float64(len(slice))/float64(cap(slice)) < shrinkThreshold {
		newSlice := make([]T, len(slice))
		copy(newSlice, slice)
		return newSlice
	}
	return slice
}

func main() {
	slice := []int{1, 2, 3, 4, 5}
	originalSlice := make([]int, len(slice))
	copy(originalSlice, slice)
	//newSlice := deleteElement(slice, 2)
	//newSlice := deleteElementEfficient(slice, 2)
	//newSlice := deleteElementGeneric(slice, 2)
	newSlice := deleteElementAndShrink(slice, 2)
	fmt.Println("New slice:", newSlice)
	fmt.Println("Original slice:", originalSlice)
}
